expect + ssh + tail で嵌った話
概要
expect を人から薦めてもらう機会があったので、やりたいこと一つ叶えてみてた。
sshでサーバに入って特定の語句を捉えてなんかする、、的なことが出来るので、
sshで入ってtailしたサーバのファイル更新内容をローカルへの標準入力に吐き出すみたいなのを作った。
EnteringOrbit
https://github.com/sassembla/EnteringOrbit/tree/master
困った事
expectでのssh後に素直にexpectでいろんなトラブルを待って、解消したらあきらめるとかtailするとかで良いと思ってたんだけど、
expect + ssh + tail なのがどうも良く無い。
予定だと、sshでログイン後に実行するのがtailで、これは本来は勝手には終了しないはずなのに、
expectコマンドで使うとtailでロックせずすっぽ抜けて、expectそのものが終了してしまう。
→(本来なら、tailは成立した瞬間からファイルの更新シグナルを待ち構える)
で、すっぽ抜けるので、どうしようかなーと思っていた。
なんとかなって、
結論としてはinteractで、expectで待ってくれないコマンドでもロックを効かせることができる。
下記のコマンドでOKだった。
expect -c "
spawn ssh someone@somewhere;
send \"tail -f ./some.txt\n\";
interact"
これで、ちゃんとtailが実行され続ける。
代償として、擬似的になんらかの入力を行わないと、Terminalにsshプロセスの残骸が残ったりするようだった。
アプリケーション側ではfileのcloseを入力する事でちゃんと閉じるようにしてある。
(メモ)README.mdに書くべき事
EnteringOrbit -s someone@somewhere -t ./some.txt | nnotif
で、サーバにsshで入ってsome.txtをtailした結果をMacのローカルなNotificationに放流できたりする。
これでサーバのログを見ながらコード上にエラー表示したりするのが楽になる。みたいな。
nnotif は標準入力からMacのNSDistributedNotificationを発行するやつ。
nnotif
https://github.com/sassembla/nnotif
やー やっぱりコマンドラインは柔軟だけど面倒くさいですね。あとでラップしちゃうからいいけど。